package it.crosato.stage.server.model.comparison;

import it.crosato.stage.shared.objects.Multiset;

public class Utilities {

	/**
	 * Calcola la matrice di distanza totale, come media pesata di quelle
	 * relative al modello basato sugli insiemi e a quello basato sulle reti di Petri
	 * @param setDM matrice delle distanze del metodo basato sugli insiemi
	 * @param invDM matrice delle distanze del metodo basato sulle reti di Petri
	 * @param factor fattore di influenza del metodo basato sulle reti di Petri
	 * @return la matrice di distanza totale
	 */
	public static double[][] calculateDistanceMatrix(double[][] setDM, double[][] invDM, double factor) {
		double[][] DM = new double[setDM.length][setDM.length];
		for (int i = 0; i < DM.length; i++) {
			for (int j = 0; j < DM.length; j++) {
				double weightedSetDistance = setDM[i][j] * (1-factor);
				double weightedInvDistance = invDM[i][j] * factor;
				DM[i][j] = weightedInvDistance + weightedSetDistance;
			}
		}
		return DM;
	}
	
	/**
	 * Calcola l'indice di Sorenses di due multi-insiemi.
	 * @param multiX il primo multi-insieme
	 * @param multiY il secondo multi-insieme
	 * @return l'indice di Sorensen dei due multi-insiemi
	 */
	public static double getSorensenIndex(Multiset multiX, Multiset multiY) {
		int xCard = multiX.getCardinality();
		int yCard = multiY.getCardinality();
		int interCard = multiX.getIntersectionCardinality(multiY);
		return ((double)(2 * interCard)) / ((double)(xCard + yCard));
	}
}
